home *** CD-ROM | disk | FTP | other *** search
- From voyager!apctrc!uc.msc.edu!mips!zaphod.mps.ohio-state.edu!
- qt.cs.utexas.edu!news!noc.near.net!uhasun!smylex!jlee
- Mon Nov 18 12:53:14 CST 1991
- Article: 4702 of comp.music
- Xref: voyager rec.games.programmer:4283 comp.music:4702
- Path: voyager!apctrc!uc.msc.edu!mips!zaphod.mps.ohio-state.edu!
- qt.cs.utexas.edu!news!noc.near.net!uhasun!smylex!jlee
- From: jlee@smylex.UUCP (Jeff Lee)
- Newsgroups: rec.games.programmer,comp.music
- Subject: At long last -- the AdLib / SoundBlaster Quick-Reference!
- Message-ID: <143-JNEWS-1.2@smylex.UUCP>
- Date: 15 Nov 91 19:50:50 GMT
- Sender: jlee@smylex.UUCP
- Organization: The SMYLEX Usenet BBS (Newington, CT)
- Lines: 406
-
- Many apologies for the delay -- but here it is, finally...
-
- ---------------------------------- cut here ----------------------------------
-
-
- Programming the AdLib/Sound Blaster
- FM Music Chips
- Quick Reference Guide
-
- Copyright (c) 1991 by Jeffrey S. Lee
-
- jlee@smylex.uucp
-
-
-
- Warranty and Copyright Policy
-
- This document is provided on an "as-is" basis, and its author makes
- no warranty or representation, express or implied, with respect to
- its quality performance or fitness for a particular purpose. In no
- event will the author of this document be liable for direct, indirect,
- special, incidental, or consequential damages arising out of the use
- or inability to use the information contained within. Use of this
- document is at your own risk.
-
- This file may be used and copied freely so long as the applicable
- copyright notices are retained, and no modifications are made to the
- text of the document. No money shall be charged for its distribution
- beyond reasonable shipping, handling and duplication costs, nor shall
- proprietary changes be made to this document so that it cannot be
- distributed freely. This document may not be included in published
- material or commercial packages without the written consent of its
- author.
-
-
-
- Overview
-
- Two of the most popular sound cards for the IBM-PC, the AdLib and the
- Sound Blaster, suffer from a real dearth of clear documentation for
- programmers. AdLib Inc. and Creative Labs, Inc. both sell developers'
- kits for their sound cards, but these are expensive, and (in the case
- of the Sound Blaster developers' kit) can be extremely cryptic.
-
- This document is intended to provide programmers with a FREE source
- of information about the programming of these sound cards.
-
- The information contained in this document is a combination of
- information found in the Sound Blaster Software Developer's Kit, and
- that learned by painful experience. Some of the information may not
- be valid for AdLib cards; if this is so, I apologize in advance.
-
- Please note that numbers will be given in hexadecimal, unless otherwise
- indicated. If a number is written out longhand (sixteen instead of 16)
- it is in decimal. Bits within a byte are numbered from 0 (the rightmost,
- least significant bit) to 7 (the leftmost, most significant bit). Sound
- channels are likewise numbered; the nine channels will be designated as
- channels 0 through 8.
-
-
-
-
- Chapter One - Sound Card I/O
-
- The sound card is programmed by sending data to its internal registers
- via its two I/O ports:
-
- 0388 (hex) - Address/Status port (R/W)
- 0389 (hex) - Data port (W/O)
-
- The sound card possesses an array of two hundred forty-four registers;
- to write to a particular register, send the register number (01-F5) to
- the address port, and the desired value to the data port.
-
- After writing to the register port, you must wait twelve cycles before
- sending the data; after writing the data, eighty-four cycles must elapse
- before any other sound card operation may be performed.
-
- The sound card registers are write-only.
-
- The address port also functions as a sound card status byte. To
- retrieve the sound card's status, simply read port 0388. The status
- byte has the following structure:
-
- 7 6 5 4 3 2 1 0
- +------+------+------+------+------+------+------+------+
- | both | tmr | tmr | unused |
- | tmrs | 1 | 2 | |
- +------+------+------+------+------+------+------+------+
-
- Bit 7 - set if either timer has expired.
- 6 - set if timer 1 has expired.
- 5 - set if timer 2 has expired.
-
-
-
- Chapter Two - The Registers
-
- The following table shows the function of each register in the sound
- card. Registers will be explained in detail after the table. Registers
- not listed are unused.
-
- Address Function
- ------- ----------------------------------------------------
- 01 Test LSI / Enable waveform control
- 02 Timer 1 data
- 03 Timer 2 data
- 04 Timer control flags
- 08 Speech synthesis mode / Keyboard split note select
- 20..35 Amp Mod / Vibrato / EG type / Key Scaling / Multiple
- 40..55 Key scaling level / Operator output level
- 60..75 Attack Rate / Decay Rate
- 80..95 Sustain Level / Release Rate
- A0..A8 Frequency (low 8 bits)
- B0..B8 Key On / Octave / Frequency (high 2 bits)
- BD AM depth / Vibrato depth / Rhythm control
- C0..C8 Feedback strength / Connection type
- E0..F5 Wave Select
-
- The groupings of twenty-two registers (20-35, 40-55, etc.) have an odd
- order due to the use of two operators for each FM voice. The following
- table shows the offsets within each group of registers for each operator.
-
-
- Channel 1 2 3 4 5 6 7 8 9
- Operator 1 00 01 02 08 09 0A 10 11 12
- Operator 2 03 04 05 0B 0C 0D 13 14 15
-
- Thus, the addresses of the attack/decay bytes for channel 3 are 62 for
- the first operator, and 65 for the second. (The address of the second
- operator is always the address of the first operator plus three).
-
- To further illustrate the relationship, the addresses needed to control
- channel 5 are:
-
- 29 - Operator 1 AM/VIB/EG/KSR/Multiplier
- 2C - Operator 2 AM/VIB/EG/KSR/Multiplier
- 49 - Operator 1 KSL/Output Level
- 4C - Operator 2 KSL/Output Level
- 69 - Operator 1 Attack/Decay
- 6C - Operator 2 Attack/Decay
- 89 - Operator 1 Sustain/Release
- 8C - Operator 2 Sustain/Release
- A4 - Frequency (low 8 bits)
- B4 - Key On/Octave/Frequency (high 2 bits)
- C4 - Feedback/Connection Type
- E9 - Operator 1 Waveform
- EC - Operator 2 Waveform
-
-
-
- Explanations of Registers
-
- Byte 01 - This byte is normally used to test the LSI device. All bits
- should normally be zero. Bit 5, if enabled, allows the FM
- chips to control the waveform of each operator.
-
- 7 6 5 4 3 2 1 0
- +-----+-----+-----+-----+-----+-----+-----+-----+
- | unused | WS | unused |
- +-----+-----+-----+-----+-----+-----+-----+-----+
-
-
- Byte 02 - Timer 1 Data. If Timer 1 is enabled, the value in this
- register will be incremented until it overflows. Upon
- overflow, the sound card will signal a TIMER interrupt
- (INT 08) and set bits 7 and 6 in its status byte. The
- value for this timer is incremented every eighty (80)
- microseconds.
-
-
- Byte 03 - Timer 2 Data. If Timer 2 is enabled, the value in this
- register will be incremented until it overflows. Upon
- overflow, the sound card will signal a TIMER interrupt
- (INT 08) and set bits 7 and 5 in its status byte. The
- value for this timer is incremented every three hundred
- twenty (320) microseconds.
-
-
- Byte 04 - Timer Control Byte
-
- 7 6 5 4 3 2 1 0
- +-----+-----+-----+-----+-----+-----+-----+-----+
- | IRQ | T1 | T2 | unused | T2 | T1 |
- | RST | MSK | MSK | | CTL | CTL |
- +-----+-----+-----+-----+-----+-----+-----+-----+
-
- bit 7 - Resets the flags for timers 1 & 2. If set,
- all other bits are ignored.
- bit 6 - Masks Timer 1. If set, bit 0 is ignored.
- bit 5 - Masks Timer 2. If set, bit 1 is ignored.
- bit 1 - When clear, Timer 2 does not operate.
- When set, the value from byte 03 is loaded into
- Timer 2, and incrementation begins.
- bit 0 - When clear, Timer 1 does not operate.
- When set, the value from byte 02 is loaded into
- Timer 1, and incrementation begins.
-
-
- Byte 08 - CSM Mode / Keyboard Split.
-
- 7 6 5 4 3 2 1 0
- +-----+-----+-----+-----+-----+-----+-----+-----+
- | CSM | Key | unused |
- | sel | Spl | |
- +-----+-----+-----+-----+-----+-----+-----+-----+
-
- bit 7 - When set, selects composite sine-wave speech synthesis
- mode (all KEY-ON bits must be clear). When clear,
- selects FM music mode.
-
- bit 6 - Selects the keyboard split point (in conjunction with
- the F-Number data). The documentation in the Sound
- Blaster manual is utterly incomprehensible on this;
- I can't reproduce it without violating their copyright.
-
-
- Bytes 20-35 - Amplitude Modulation / Vibrato / Envelope Generator Type /
- Keyboard Scaling Rate / Modulator Frequency Multiple
-
- 7 6 5 4 3 2 1 0
- +-----+-----+-----+-----+-----+-----+-----+-----+
- | Amp | Vib | EG | KSR | Modulator Frequency |
- | Mod | | Typ | | Multiple |
- +-----+-----+-----+-----+-----+-----+-----+-----+
-
- bit 7 - Apply amplitude modulation when set; AM depth is
- controlled by the AM-Depth flag in address BD.
- bit 6 - Apply vibrato when set; vibrato depth is controlled
- by the Vib-Depth flag in address BD.
- bit 5 - When set, the sustain level of the voice is maintained
- until released; when clear, the sound begins to decay
- immediately after hitting the SUSTAIN phase.
- bit 4 - Keyboard scaling rate. This is another incomprehensible
- bit in the Sound Blaster manual. From experience, if
- this bit is set, the sound's envelope is foreshortened as
- it rises in pitch.
- bits 3-0 - These bits indicate which harmonic the operator will
- produce sound (or modulation) in relation to the voice's
- specified frequency:
-
- 0 - one octave below
- 1 - at the voice's specified frequency
- 2 - one octave above
- 3 - an octave and a fifth above
- 4 - two octaves above
- 5 - two octaves and a major third above
- 6 - two octaves and a fifth above
- 7 - two octaves and a minor seventh above
- 8 - three octaves above
- 9 - three octaves and a major second above
- A - three octaves and a major third above
- B - " " " " " " "
- C - three octaves and a fifth above
- D - " " " " " "
- E - three octaves and a major seventh above
- F - " " " " " " "
-
-
- Bytes 40-55 - Level Key Scaling / Total Level
-
- 7 6 5 4 3 2 1 0
- +-----+-----+-----+-----+-----+-----+-----+-----+
- | Scaling | Total Level |
- | Level | 24 12 6 3 1.5 .75 | <-- dB
- +-----+-----+-----+-----+-----+-----+-----+-----+
-
- bits 7-6 - causes output levels to decrease as the frequency
- rises:
-
- 00 - no change
- 10 - 1.5 dB/8ve
- 01 - 3 dB/8ve
- 11 - 6 dB/8ve
-
- bits 5-0 - controls the total output level of the operator.
- all bits CLEAR is loudest; all bits SET is the
- softest. Don't ask me why.
-
-
- Bytes 60-75 - Attack Rate / Decay Rate
-
- 7 6 5 4 3 2 1 0
- +-----+-----+-----+-----+-----+-----+-----+-----+
- | Attack | Decay |
- | Rate | Rate |
- +-----+-----+-----+-----+-----+-----+-----+-----+
-
- bits 7-4 - Attack rate. 0 is the slowest, F is the fastest.
- bits 3-0 - Decay rate. 0 is the slowest, F is the fastest.
-
-
- Bytes 80-95 - Sustain Level / Release Rate
-
- 7 6 5 4 3 2 1 0
- +-----+-----+-----+-----+-----+-----+-----+-----+
- | Sustain Level | Release |
- | 24 12 6 3 | Rate |
- +-----+-----+-----+-----+-----+-----+-----+-----+
-
- bits 7-4 - Sustain Level. 0 is the loudest, F is the softest.
- bits 3-0 - Release Rate. 0 is the slowest, F is the fastest.
-
-
- Bytes A0-B8 - Octave / F-Number / Key-On
-
- 7 6 5 4 3 2 1 0
- +-----+-----+-----+-----+-----+-----+-----+-----+
- | F-Number (least significant byte) | (A0-A8)
- | |
- +-----+-----+-----+-----+-----+-----+-----+-----+
-
- 7 6 5 4 3 2 1 0
- +-----+-----+-----+-----+-----+-----+-----+-----+
- | Unused | Key | Octave | F-Number | (B0-B8)
- | | On | | most sig. |
- +-----+-----+-----+-----+-----+-----+-----+-----+
-
- bit 5 - Channel is voiced when set, silent when clear.
- bits 4-2 - Octave (0-7). 0 is lowest, 7 is highest.
- bits 1-0 - Most significant bits of F-number.
-
- In octave 4, the F-number values for the chromatic scale and their
- corresponding frequencies would be:
-
- F Number Frequency Note
- 16B 277.2 C#
- 181 293.7 D
- 198 311.1 D#
- 1B0 329.6 E
- 1CA 349.2 F
- 1E5 370.0 F#
- 202 392.0 G
- 220 415.3 G#
- 241 440.0 A
- 263 466.2 A#
- 287 493.9 B
- 2AE 523.3 C
-
-
- Bytes C0-C8 - Feedback / Algorithm
-
- 7 6 5 4 3 2 1 0
- +-----+-----+-----+-----+-----+-----+-----+-----+
- | unused | Feedback | Alg |
- | | | |
- +-----+-----+-----+-----+-----+-----+-----+-----+
-
- bits 3-1 - Feedback strength. If all three bits are set to
- zero, no feedback is present. With values 1-7,
- operator 1 will send a portion of its output back
- into itself. 1 is the least amount of feedback,
- 7 is the most.
- bit 0 - If set to 0, operator 1 modulates operator 2. In this
- case, operator 2 is the only one producing sound.
- If set to 1, both operators produce sound directly.
- Complex sounds are more easily created if the algorithm
- is set to 0.
-
-
- Byte BD - Amplitude Modulation Depth / Vibrato Depth / Rhythm
-
- 7 6 5 4 3 2 1 0
- +-----+-----+-----+-----+-----+-----+-----+-----+
- | AM | Vib | Rhy | BD | SD | TOM | Top | HH |
- | Dep | Dep | Ena | | | | Cym | |
- +-----+-----+-----+-----+-----+-----+-----+-----+
-
- bit 7 - Set: AM depth is 4.8dB
- Clear: AM depth is 1 dB
- bit 6 - Set: Vibrato depth is 14 cent
- Clear: Vibrato depth is 7 cent
- bit 5 - Set: Rhythm enabled (6 melodic voices)
- Clear: Rhythm disabled (9 melodic voices)
- bit 4 - Bass drum on/off
- bit 3 - Snare drum on/off
- bit 2 - Tom tom on/off
- bit 1 - Cymbal on/off
- bit 0 - Hi Hat on/off
-
- Note: KEY-ON registers for channels 06, 07, and 08 must be OFF
- in order to use the rhythm section. Other parameters
- such as attack/decay/sustain/release must also be set
- appropriately.
-
-
- Bytes E0-F5 - Waveform Select
-
- 7 6 5 4 3 2 1 0
- +-----+-----+-----+-----+-----+-----+-----+-----+
- | unused | Waveform |
- | | Select |
- +-----+-----+-----+-----+-----+-----+-----+-----+
-
- bits 1-0 - When bit 5 of address 01 is set, the output waveform
- will be distorted according to the waveform indicated
- by these two bits. I'll try to diagram them here,
- but this medium is fairly restrictive.
-
- ___ ___ ___ ___ _ _
- / \ / \ / \ / \ / | / |
- /_____\_______ /_____\_____ /_____\/_____\ /__|___/__|___
- \ /
- \___/
-
- 00 01 10 11
-
-
-